@@ -17,6 +17,7 @@ urlpatterns += [ |
||
17 | 17 |
|
18 | 18 |
urlpatterns += [ |
19 | 19 |
url(r'^pay/wx/order_create$', pay_views.wx_order_create_api, name='wx_order_create_api'), # 订单创建 |
20 |
+ url(r'^pay/wx/notify_url$', pay_views.wx_notify_url_api, name='wx_notify_url_api'), # 支付异步通知回调地址 |
|
20 | 21 |
] |
21 | 22 |
|
22 | 23 |
urlpatterns += [ |
@@ -93,4 +93,4 @@ server { |
||
93 | 93 |
proxy_pass http://kodosale; |
94 | 94 |
include /home/diors/work/kodosale/kodosale/deploy/uwsgi_params; # the uwsgi_params file you installed |
95 | 95 |
} |
96 |
-} |
|
96 |
+} |
@@ -67,7 +67,7 @@ def wx_order_create_api(request): |
||
67 | 67 |
return response(PackGoodsStatusCode.PACK_GOODS_NOT_FOUND) |
68 | 68 |
|
69 | 69 |
# 金额校验 |
70 |
- if reduce(lambda g1, g2: g1.price * g1.num + g2.price * g2.num, goods_info) != total_fee: |
|
70 |
+ if reduce(lambda g1, g2: g1.get('price', 0) * g1.get('num', 0) + g2.get('price', 0) * g2.get('num', 0), goods_info) != total_fee: |
|
71 | 71 |
return response(OrderStatusCode.FEE_CHECK_FAIL) |
72 | 72 |
|
73 | 73 |
# JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里 |
@@ -94,7 +94,7 @@ def wx_order_create_api(request): |
||
94 | 94 |
try: |
95 | 95 |
prepay_data = wxpay.order.create( |
96 | 96 |
body=body, |
97 |
- notify_url=settings.API_DOMAIN + '/wx/notify_url', |
|
97 |
+ notify_url=settings.API_DOMAIN + 'pay/wx/notify_url', |
|
98 | 98 |
out_trade_no=order.order_id, |
99 | 99 |
total_fee=total_fee, |
100 | 100 |
trade_type=trade_type, |
@@ -136,3 +136,28 @@ def order_paid_fail(order): |
||
136 | 136 |
|
137 | 137 |
order.pay_status = OrderInfo.FAIL |
138 | 138 |
order.save() |
139 |
+ |
|
140 |
+@logit |
|
141 |
+@transaction.atomic |
|
142 |
+def wx_notify_url_api(request): |
|
143 |
+ """ 支付异步通知回调地址 """ |
|
144 |
+ notify_data, success = check_pay_notify(request.body, wx_configs=settings.WECHAT) |
|
145 |
+ if not success: |
|
146 |
+ return HttpResponse(WXPAY_NOTIFY_FAIL) |
|
147 |
+ |
|
148 |
+ try: |
|
149 |
+ order = OrderInfo.objects.select_for_update().get(order_id=notify_data.get('out_trade_no', ''), status=True) |
|
150 |
+ except OrderInfo.DoesNotExist: |
|
151 |
+ return HttpResponse(WXPAY_NOTIFY_FAIL) |
|
152 |
+ |
|
153 |
+ order.notify_msg = request.body |
|
154 |
+ order.transaction_id = notify_data.get('transaction_id', '') |
|
155 |
+ order.save() |
|
156 |
+ |
|
157 |
+ result_code = notify_data.get('result_code', '') |
|
158 |
+ if result_code == 'SUCCESS': |
|
159 |
+ order_paid_success(order) |
|
160 |
+ else: |
|
161 |
+ order_paid_fail(order) |
|
162 |
+ |
|
163 |
+ return HttpResponse(WXPAY_NOTIFY_SUCCESS) |